module.exports = (options,app) => {
	return async (ctx,next) => {
		try{
			await next()
			//404系统不会判定为系统错误，所以不会走异常，要单独判断
			if(ctx.response.status == 404){
				ctx.status = 404
				ctx.body = {
					errorCode: 40000,
					msg: '路由不存在'
				}
			}
			//判断是否开启token验证
			if (!options.isOpen) return;
			//排除不需要验证 token 的路由
			if (options.allowed.indexOf(ctx.request.url) > -1) return;
			//验证token
			if(!ctx.request.header.token){
				ctx.status = 401
				ctx.body = {
					errorCode: 20003,
					msg: '无权访问'
				}
			}else{
				let token = await ctx.helper.redisGet(ctx.request.header.token)
				// 没有token代表未登录或已过期
				if(token == null){
					ctx.status = 401
					ctx.body = {
						errorCode: 20003,
						msg: '未登录或Token已过期'
					}
				}
			}
		}catch(err){
			//记录错误日志
			ctx.app.emit('error',err,ctx)
			//返回错误异常
			ctx.status = err.statusCode || err.status || 500
			ctx.body = {
				errorCode: err.errorCode || err.code || err.name,
				msg: err.msg || err.message,
				errors: err.errors
			}
		}
	}
}